package org.framework.common.api.service.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.framework.common.api.entity.CommonEntityAware;
import org.framework.common.api.support.model.PageModel;
import org.framework.common.api.support.model.QueryModel;
import org.springframework.ui.ModelMap;


/**
 * <p>描述: 公用数据库访问接口</p>
 * <p>Company:上海中信信息发展股份有限公司</p>
 * @param <ENTITY> 实体类型
 * @param <ID> 主键类型
 * @author chanlong(陈龙)
 * @date 2013年12月10日  下午4:34:59
 * @version 1.0.2013.
 */
public interface CommonDaoAware<ENTITY extends CommonEntityAware<ID>, ID extends Serializable>{
	
	/**
	 * 新增.
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月28日  下午1:25:36
	 */
	public ENTITY insert(final ENTITY entity) throws Exception;
	
	/**
	 * 更新.
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月28日  下午1:26:15
	 */
	public ENTITY update(final ENTITY entity) throws Exception;
	
	/**
	 * 删除.
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月28日  下午1:25:49
	 */
	public void remove(final ENTITY entity) throws Exception;
	
	/**
	 * 加载.
	 * @param entity 实体对象
	 * @return
	 * @throws Exception
	 * @author Administrator(陈龙)
	 * @date 2014-1-22  下午2:05:12
	 */
	public ENTITY loader(final ENTITY entity) throws Exception;
	
	/**
	 * 加载.
	 * @param cls 实体对象类
	 * @param id 主键
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2013年12月28日  下午1:47:57
	 */
	public ENTITY loader(final Class<ENTITY> cls, final ID id) throws Exception;
	
	/**
	 * 加载.
	 * @param cls
	 * @param params
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月9日 下午7:05:05
	 */
	public ENTITY loader(final Class<ENTITY> cls, final Map<String, Object> params) throws Exception;
	
	/**
	 * 加载.
	 * @param cls
	 * @param field
	 * @param value
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2014年4月25日  下午9:15:20
	 */
	public ENTITY loader(final Class<ENTITY> cls, final String field, final Object value) throws Exception;
	
	/**
	 * 查询结果纪录总数.
	 * @param support
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月13日 下午3:21:37
	 */
	public long count(QueryModel support) throws Exception;
	
	/**
	 * 分页动态条件查询.
	 * @param support
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年1月20日 下午4:04:04
	 */
	public PageModel<ENTITY> findByQuery(final QueryModel support) throws Exception;
	
	/**
	 * jpql查询.
	 * @param cls
	 * @param jpql
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2014年3月3日  上午10:59:28
	 */
	public List<ENTITY> findByQuery(final Class<ENTITY> cls, final String jpql) throws Exception;
	
	/**
	 * jpql查询.
	 * @param cls
	 * @param jpql
	 * @param params
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年1月30日 上午10:38:47
	 */
	public List<ENTITY> findByQuery(final Class<ENTITY> cls, final String jpql, final ModelMap params) throws Exception;

}
